package liuyang.bigeventserver.common.config;

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

/**
 * ObjectMapper
 * 负责向与前端通信范围
 *
 * 注：Redis Template中用的ObjectMapper与这里的不是一个。分开配置，方便调整。
 * RedisTemplate中需要的那个ObjectMapper负责与Redis通信过程中的序列化与反序列化
 * 见redis配置
 *
 * @author xconf
 * @since 2024/3/2
 *        2024/3/11 为解决JS中的Long精度丢失问题，将框架OM行为修改为将Long改成字符串。 在使用Snowflake生成的id时应该都会遇到这个问题
 */
@Configuration
public class JacksonConfig implements Jackson2ObjectMapperBuilderCustomizer {// 看spring-boot-autoconfigure中的jackson

    // 解决JS Long精度丢失问题。
    // 参考https://blog.csdn.net/weixin_43025151/article/details/129520159
    // 配置默认的om对象。实际解决没使用文摘中的方法。
    // 2024/3/11 为解决JS中的Long精度丢失问题，将框架OM行为修改为将Long改成字符串。 在使用Snowflake生成的id时应该都会遇到这个问题
    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);// 2024/3/11 实测好用！
    }
}
